nx |= PGT_validated;
}
}
- else if ( unlikely((x & PGT_type_mask) != type) )
+ else if ( unlikely((x & (PGT_type_mask|PGT_va_mask)) != type) )
{
- DPRINTK("Bad type (saw %08x != exp %08x) for pfn %08lx\n",
- x & PGT_type_mask, type, page_to_pfn(page));
+ if ( unlikely((x & PGT_type_mask) != (type & PGT_type_mask) ) )
+ {
- if ((x & PGT_type_mask) != PGT_l2_page_table &&
- type != PGT_l1_page_table)
- DPRINTK("Unexpected type (saw %08x != exp %08x) for pfn %08lx\n",
- x & PGT_type_mask, type, page_to_pfn(page));
+#ifdef VERBOSE
- return 0;
++ if ( ((x & PGT_type_mask) != PGT_l2_page_table) ||
++ ((type & PGT_type_mask) != PGT_l1_page_table) )
++ DPRINTK("Bad type (saw %08x != exp %08x) for pfn %08lx\n",
++ x & PGT_type_mask, type, page_to_pfn(page));
+#endif
+ return 0;
+ }
+ else if ( (x & PGT_va_mask) == PGT_va_mutable )
+ {
+ /* The va backpointer is mutable, hence we update it. */
+ nx &= ~PGT_va_mask;
+ nx |= type; /* we know the actual type is correct */
+ }
+ else if ( unlikely((x & PGT_va_mask) != (type & PGT_va_mask)) )
+ {
+ /* The va backpointer wasn't mutable, and is different. */
+ DPRINTK("Unexpected va backpointer (saw %08x != exp %08x)"
+ " for pfn %08lx\n", x, type, page_to_pfn(page));
+ return 0;
+ }
}
- else if ( unlikely(!(x & PGT_validated)) )
+ else if ( unlikely(!(x & PGT_validated)) )
{
/* Someone else is updating validation of this page. Wait... */
- while ( (y = page->u.inuse.type_info) != x )
+ while ( (y = page->u.inuse.type_info) == x )
{
rep_nop();
barrier();